package api;
import com.fasterxml.jackson.databind.ObjectMapper;
import dao.Blog;
import dao.BlogDao;
import dao.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.List;

//博客系统，后续还会写一些Servlet给前端提供功能支持
//这些都可以理解成服务器给前端提供的API，也可理解成服务器给前端提供的API（编程的接口）
@WebServlet("/blog")
public class BlogServlet extends HttpServlet {
    private ObjectMapper objectMapper=new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //查询数据库，获取到数据之后，构造成要求的json格式并且返回
        //先尝试获取下blogId这个参数，看能不能获取到
        BlogDao blogDao=new BlogDao();
        String blogId=req.getParameter("blogId");
        if(blogId==null){
            //此处把java对象数组，转化成了json格式的字符串
            List<Blog> blogs=blogDao.getBlogs();
            //jackon看到blogs是一个List,就会构造出一个json数组[]，针对List中每个BLog对象，分别构造出json对象，具体构造的过程，也就是根据Blog的属性来的，属性的名字，就是json的key，属性的值，就是json的value
            String respJson=objectMapper.writeValueAsString(blogs);
            resp.setContentType("application/json;charset=utf8");
            resp.getWriter().write(respJson);
        }else {
            //此时说明是获取博客详情页,有blogId参数
            Blog blog=blogDao.getBlog(Integer.parseInt(blogId));
            if (blog==null){
                //http://localhost:8080/blog_new/blog_content.html?blogId=1
                //http://localhost:8080/blog_new/blog_content.html?blogId=2
                //我们能看到不同的博客列表有不同的博客ID
                //返回一个id为0的blog对象，前端再根据这里进行判定
                blog=new Blog();
            }
            String respJson= objectMapper.writeValueAsString(blog);
            resp.setContentType("application/json;charset=utf8");
            resp.getWriter().write(respJson);
        }
    }
    /*
    本质上和登入非常相似，核心都是通过form表单，把页面中用户输入的内容，给提交到服务器这边，服务器就可以把内容保存到数据库中即可
    1.约定前后端交互接口
    使用form提交数据到服务器
    请求
    POST/blog
    Content-Type:application/x-www-form-urlencoded
    title=xxx&content=xxxx
    响应
    HTTP/1.1 302
    Location:blog_list.html
    提交成功，跳转到博客列表页，来到列表页，就能够看到刚才新发布的博客了
     */

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //1.获取登入的用户
        HttpSession session=req.getSession(false);
        if(session==null){
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("用户未登录！无法发布博客");
            return;
        }
        User user=(User) session.getAttribute("user");
        if (user==null){
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("用户未登录！无法发布博客");
            return;
        }
        //在博客编辑页，已经做了登录检查了，当用户提交的时候，必然是已经登入的状态
        //2.获取到请求中传过来的内容
        req.setCharacterEncoding("utf8");//这个操作，为了防止遇到中文会出现乱码
        String title=req.getParameter("title");
        String content=req.getParameter("content");
        if (title==null||content==null||"".equals(title)||"".equals(content)){
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("标题或者正文为空");
            return;
        }
        //2。构造blog对象，并且插入到数据库中
        Blog blog=new Blog();
        blog.setTitle(title);
        blog.setContent(content);
        blog.setUserId(user.getUseId());
        //由于sql插入数据的时候，已经使用sql自带的now获取当前时间，不需要此处代码中手动设置时间了
       // blog.setPostTime(new Timestamp(System.currentTimeMillis()));可以这样手动，差异速度不是很大
        BlogDao blogDao=new BlogDao();
        blogDao.insert(blog);
        //4.跳转到博客列表页
        resp.sendRedirect("blog_list.html");
    }
}
